/**
 *  用于验证用户是否合法
 *  Created by lihao on 2018-03-24
 */
const crypto = require('crypto');
const secret = require('../conf/secret');
const db = require('../conf');

function Auth(obj) {
    this.username = '';
    this.password = '';
    for(let key in obj){
        this[key] = obj[key]
    }
    this.secret = secret||'';
}
// 验证用户是否合法
Auth.prototype.check = function () {
    /**
     *  先按用的名字去数据库，拿到保存在数据库密码
     *  然后用用户提供的密码，进行密码生成， 再将两者进行比较
     *  相同且没有过期判定为合法用户
     * @type {Auth}
     */
    let that = this;
    const sql = 'SELECT name,password FROM by_user WHERE name=?';
    // pool 为一个promise对象，在check中引用，再引用时User.check().then(res=>{})  // res 将为  1 或 0
    return new Promise(function (resolve) {
        // 当用户只提供用户名或密码时直接返回空
        // 就不去数据库验证
        if(!that.username||!that.password) {
            resolve(0)
        } else {
            db(sql,[that.username]).then(function(res){
                // 判断数据库有没有该用户的相关信息
                if(res.length!==0){
                    // 数据库获取的密码
                    const server_password = res[0].password;
                    // 对用户提供的密码进行加密
                    const client_password = that.encryption(that.password);
                    // 判断用户是否合法
                    const result = server_password === client_password ? 1:0;
                    resolve(result)
                } else if(res.length ===0) {
                    // 当没有查询到用户信息时直接返回false
                    resolve(0)
                }
            });
        }
    })

};

// 加密密码
Auth.prototype.encryption = function(){
    // 当用户只提供用户名或密码时直接返回空
    if(!this.username||!this.password) {return ''}
    // 获取服务器上的Auth加密码 对用户提供的密码进行加密
    return crypto.createHmac('sha256',this.secret.auth)
                        .update((this.password).toString())
                        .digest('hex');
};

module.exports = Auth;

